/* Объявление глобального объединения */

/* В данном случае в объединении задается
   только определение переменных без их инициализации */

union union_ram
{
unsigned int a; 		// Объявляем целую переменную a
unsigned char b; 		// Объявляем символьную переменную b
unsigned int c; 		// Объявляем целую переменную c
} un_ram;

/* Основная функция программы */

void main(void)
{
unsigned char x; 	// Объявляем локальную символьную переменную x
unsigned int y; 	// Объявляем локальную целую переменную y

/* определим указатель point объединения union_ram
   с помощью знака (*) */

union union_ram *point;

/* прямой доступ к элементам объединения */

/* Присвоим переменной a в объединении, например,
   значение 0b1000110001000110=0x8C46=35910 */

un_ram.a=0b1000110001000110;

/* Объединение un_ram занимает в SRAM 16 бит (2 байта),
   т.к. такой размер имеет самый большой элемент
   объединения (int) (см. табл. 25, стр. 313). Теперь в эту область
   памяти записано число 35910 */

x=un_ram.b;

/* x примет значение 'F', т.к. переменная x имеет тип char,
   т.е. она имеет размер 8 бит (1 байт) (см. табл. 25, стр. 313).
   Таким образом, значение x будет соответствовать числу,
   записанному в младших 8 битах области памяти, выделенной
   под объединение un_ram, т.е. x=0b1000110=0x46=70,
   а десятичный код 70 как раз и соответствует символу 'F' ASCII */

y=un_ram.c;

/* y примет снова примет значение 35910, т.к. переменная c имеет тип
   int, т.е. она имеет размер 16 бит (2 байта), точно такой же, как у
   переменной a. Следовательно, значение y будет соответствовать
   числу, записанному во всех 16 битах области памяти, выделенной
   под объединение un_ram, т.е. y=0b1000110001000110=0x8C46=35910 */
}
